-- 题目：输入一个整数数组，判断该数组是不是某二元查找树的后序遍历的结果。如果是返回true，否则返回false。

-- 例如输入5、7、6、9、11、10、8，由于这一整数序列是如下树的后序遍历结果：

--          8
--        /  \
--       6    10
--     / \    / \
--    5   7   9  11

-- 因此返回true。

-- 如果输入7、4、6、5，没有哪棵树的后序遍历的结果是这个序列，因此返回false。

-- 分析：这是一道trilogy的笔试题，主要考查对二元查找树的理解。

-- 在后续遍历得到的序列中，最后一个元素为树的根结点。从头开始扫描这个序列，比根结点小的元素都应该位于序列的左半部分；
-- 从第一个大于跟结点开始到跟结点前面的一个元素为止，所有元素都应该大于跟结点，因为这部分元素对应的是树的右子树。
-- 根据这样的划分，把序列划分为左右两部分，我们递归地确认序列的左、右两部分是不是都是二元查找树。


local data = {3,2,1,4}

--剪枝比较重要
function check(data,startIndex,endIndex)
	--print("startIndex---"..startIndex.."---endIndex---"..endIndex)
	if(startIndex >= endIndex) then
		return true ;
	end
	local currentData = data[endIndex] ;
	local currentIndex ;
	for i=startIndex,endIndex  do
		currentIndex = i ;
		if(data[i]>currentData) then
			break;
		end
	end

	for j=currentIndex+1,endIndex do
		if(data[j]<currentData) then
			return false ;
		end
	end
	if(endIndex - startIndex) <= 1 then
		return true ;
	end

	--print("currentIndex---"..currentIndex)
	local left = true ;
	if(currentIndex>1) then
		left = check(data,1,currentIndex-1) ;
	end

	local right = true ;
	if(currentIndex<#data) then
		right = check(data,currentIndex,endIndex-1);
	end

	return left and right ;
end

print(check(data,1,#data));